/**
 * Copyright (c) 2020-2024, huli.com
 * All rights reserved.
 */
package com.xiaohujr.xuexue.vm.gc;

/**
 * 槽的回收及复用.
 * 虚拟机参数 -verbose:gc
 *
 * @author Xue Xue (xuexue1@huli.com)
 * @version 1.0
 * @since 2020/6/29
 */
public class SlotGCandReuse {

    /**
     * [GC (System.gc())  68235K->66216K(125952K), 0.0025831 secs]
     * [Full GC (System.gc())  66216K->66101K(125952K), 0.0066603 secs]
     * 未被回收因为执行System.gc时，placeholder还在作用域之内，虚拟机自然不敢回收内存.
     */
    public static void test1() {
        byte[] placeHolder = new byte[64 * 1024 * 1024];
        System.gc();
    }

    /**
     * 虽然作用域被限制在括号中了，但依然没有被回收.
     */
    public static void test2() {
        {
            byte[] placeholder = new byte[64 * 1024 * 1024];
        }
        System.gc();
    }

    /**
     * 当前字节码PC计数器的值如果已经超出了某个变量的作用域，这个对应变量的slot就可以被其他变量使用.
     */
    public static void test3() {
        {
            byte[] placeholder = new byte[64 * 1024 * 1024];
        }
        int a = 0;
        System.gc();
    }

    public static void main(String[] args) {
        test3();
    }
}
